package cn.feng.thinkInJava.a9_2_泛型.generics.a15_17_03;
//: generics/Fill.java
// Generalizing the FilledList idea
// {main: FillTest}
import java.util.*;
//当你并为碰巧拥有正确的接口时
// Doesn't work with "anything that has an add()." There is
// no "Addable" interface so we are narrowed to using a
// Collection. We cannot generalize using generics in
// this case.
public class Fill
{
	public static <T>void fill(Collection<T> collection,Class<? extends T> classToken,int size)
	{
		for(int i=0;i<size;i++)
			// Assumes default constructor:
			try
			{
				collection.add(classToken.newInstance());
			}
			catch(Exception e)
			{
				throw new RuntimeException(e);
			}
	}
}

class Contract
{
	private static long counter=0;
	private final long id=counter++;
	
	public String toString()
	{
		return getClass().getName()+" "+id;
	}
}

class TitleTransfer extends Contract
{
}

class FillTest
{
	public static void main(String[] args)
	{
		List<Contract> contracts=new ArrayList<Contract>();
		Fill.fill(contracts,Contract.class,3);
		Fill.fill(contracts,TitleTransfer.class,2);
		for(Contract c:contracts)
			System.out.println(c);
		SimpleQueue<Contract> contractQueue=new SimpleQueue<Contract>();
		// Won't work. fill() is not generic enough:
		// Fill.fill(contractQueue, Contract.class, 3);
	}
} /* Output:
Contract 0
Contract 1
Contract 2
TitleTransfer 3
TitleTransfer 4
*///:~
